查看原文
其他

队列DID:以知识青年“上山下乡”为例

连享会 连享会 2022-12-31

👇 连享会 · 推文导航 | www.lianxh.cn

作者:黄国宾 (广州大学)
邮箱:HuangGuobin@gzhu.edu.cn


目录

  • 1. 引言

  • 2. 模型设定

    • 2.1 标准模型

    • 2.2 Stata 操作

  • 3. 安慰剂检验

    • 3.1 检验思路

    • 3.2 Stata 操作

  • 4. 平行趋势检验

    • 4.1 检验思路

    • 4.2 Stata 操作

  • 5. 参考文献

  • 6. 相关推文



温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:

1. 引言

Duflo (2001) 在研究印度尼西亚学校建设对教育和工资的影响时,提出了队列 DID (Cohort DID),也称截面 DID。随后,在 Chen 和 Zhou (200)、程令国和张晔 (2011)、以及 Chen 等 (2020) 的研究中,该方法被广泛的应用。除此之外,连享会也有较多推文对这一方法进行了介绍。

与以往推文不同的是,本文主要是从模型设定、安慰剂检验、以及平行趋势检验三个方面介绍 Chen 等 (2020) 的文章,即针对知识青年 “上山下乡” 对教育水平影响的研究,并附上相关 Stata 操作。

2. 模型设定

传统 DID 一般有地区和时间两个维度。但是,截面数据由于缺少时间维度,只能由个体的出生队列 (年份) 代替,这也是 “队列 DID” 名称的由来。

2.1 标准模型

其中,

  • 表示个体, 表示出生队列 (年份), 代表县, 代表省份;
  • 为受教育年限, 表示各县下乡知青密度,即各县接受的下乡知青总数除以 1964 年该县总人口;
  • 表示出生队列 (年份) 的虚拟变量,出生在 1946-1955 年之间的个体为控制组,取值为 0;出生在 1956-1969 年之间的个体为处理组,取值为1。可见,该模型用出生队列 (年份) 虚拟变量替代了传统 DID 中政策冲击的时间维度虚拟变量。系数 识别的就是知识青年 “上山下乡” 对居民受教育年限影响的平均因果效应;
  • 为个体层面控制变量,包括了性别与民族;
  • 为县级固定效应;
  • 为省份-出生队列 (年份) 固定效应,这一设定允许不同省份有不同的出生队列 (年份) 固定效应,比单纯控制出生队列 (年份) 固定效应更加严格;
  • 为县基础教育水平与出生队列 (年份) 的交乘项。其中, 为各个县出生队列 (年份) 在 1946-1955 年的个体平均的小学或初中毕业率,这一设定控制了各个县初始教育水平的影响;
  • 为随机扰动项。

2.2 Stata 操作

接下来,我们利用 Chen 等 (2020) 提供的数据和代码,来展示队列 DID 的 Stata 操作。具体数据和代码,可从 「OPENICPSR」 下载。

. use census_1990_clean.dta, clear
. global var_abs_cohort "region1990 prov#year_birth
c.primary_base#year_birth c.junior_base#year_birth"
. gen treat = inrange(year_birth,1956,1969) if ///
inrange(year_birth,1946,1969)

. reghdfe yedu c.sdy_density#c.treat male han_ethn if rural==1, ///
absorb($var_abs_cohort) cluster(region1990)
. est store m1
. reghdfe yedu c.sdy_density#c.treat male han_ethn if rural==0, ///
absorb($var_abs_cohort) cluster(region1990)
. est store m2
. esttab m1 m2

--------------------------------------------
(1) (2)
yedu yedu
--------------------------------------------
c.sdy_dens~t 3.237*** 0.151
(4.62) (0.29)

male 1.874*** 0.668***
(66.05) (26.08)

han_ethn 0.150** 0.0000334
(2.66) (0.00)

_cons 5.436*** 9.564***
(98.56) (121.74)
--------------------------------------------
N 2775858 417883
--------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

可以看出,估计结果与 Chen 等 (2020) 的 Table 3 中列 (1) 和列 (2) 是一致的。列 (1) 中 显著为正,表明知青 “上山下乡” 运动确实促进了农村孩子的受教育年限。由于下乡知青平均密度为 2.22% (2.22 知青/ 100 人),因此知青 “上山下乡” 运动使得每个农村孩子的平均受教育年限提高了 0.072 年 (3.237*2.22%)。尽管列 (2) 中 估计结果也为正,但是并不显著,说明知青 “上山下乡” 运动对城镇地区孩子的受教育年限没有影响。

3. 安慰剂检验

3.1 检验思路

Chen 等 (2020) 通过改变控制组与处理组设计了两种安慰剂检验:

  • 第一种:在知青 “上山下乡” 运动前,1946–1950 年出生队列的个体为控制组,1951–1955 年出生队列的个体为处理组;
  • 第二种:在知青 “上山下乡” 运动后,1970–1974 年出生队列的个体为控制组,1975–1979 年出生队列的个体为处理组。

这两种检验分别用了 1990 年和 2000 年的人口普查数据。两种检验的计量模型分别如下:

3.2 Stata 操作

. keep if rural==1
. drop rural
. gen treat_placebo = inrange(year_birth,1951,1955) ///
if inrange(year_birth,1946,1955)
. reghdfe yedu c.sdy_density#c.treat_placebo male han_ethn, ///
absorb($var_abs_cohort) cluster(region1990)
. est store m1

. use census_2000_clean.dta, clear

. global var_abs_cohort "region2000 prov#year_birth c.primary_base#year_birth c.junior_base#year_birth"
. gen treat_placebo = inrange(year_birth,1975,1979) ///
if inrange(year_birth,1970,1979)
. reghdfe yedu c.sdy_density#c.treat_placebo male han_ethn, ///
absorb($var_abs_cohort) cluster(region2000)
. est store m2
. esttab m1 m2

--------------------------------------------
(1) (2)
yedu yedu
--------------------------------------------
c.sdy_dens~o -0.817 -0.432
(-1.42) (-1.36)

male 2.286*** 0.665***
(76.09) (44.31)

han_ethn 0.0802 0.477***
(1.45) (11.89)

_cons 4.148*** 7.161***
(76.46) (193.19)
--------------------------------------------
N 960123 947025
--------------------------------------------
t statistics in parentheses
* p<0.05, ** p<0.01, *** p<0.001

可以看出,估计结果与 Chen 等 (2020) 的 Table 3 中列 (7) 和列(8) 是一致的。两种检验中 估计结果都不显著,安慰剂检验通过。

4. 平行趋势检验

4.1 检验思路

为了进行平行趋势检验,Chen 等 (2020) 设计了如下动态的 Reduced-Form 队列 DID 模型 (Duflo,2001):

其中, 表示出生队列 (年份) 的虚拟变量,如果个体出生在年份 ,则取值为1,否则取值 0 (基准组为 1941-1945 出生队列的个体)。系数 识别的就是知识青年 “上山下乡” 对特定出生队列 ( 年) 人群受教育年限影响的平均因果效应。

4.2 Stata 操作

Chen 等 (2020) 分别使用了 1982、1990 年和 2000 年的人口普查数据,来进行平行趋势检验。

. *1990人口普查数据
. use census_1990_clean.dta, clear
. global var_abs_cohort "region1990 prov#year_birth ///
c.primary_base#year_birth c.junior_base#year_birth"
. gen treat = inrange(year_birth,1956,1969) if inrange(year_birth,1946,1969)
. keep if rural==1
. drop rural
. compress
. forvalues y = 1946/1969 {
gen I`y' = sdy_density*[year_birth==`y']
} //生成知青密度与各个出生队列(年份)虚拟变量交乘项
. reghdfe yedu I1946-I1969 male han_ethn, ///
absorb($var_abs_cohort) cluster(region1990)
. outreg2 using "Figure3.txt", replace sideway ///
noparen se nonotes nocons noaster ///
nolabel text keep(I1946-I1969) ///
sortvar(I1946-I1969) //导出回归系数到Figure3.txt

. *1982人口普查数据
. use census_1982_clean.dta, clear
. global var_abs_cohort1 "region1982 prov#year_birth ///
c.primary_base_older#year_birth c.junior_base_older#year_birth"
. forvalues y = 1946/1962 {
gen I`y' = sdy_density*[year_birth==`y']
}
. reghdfe yedu I1946-I1962 male han_ethn, ///
absorb($var_abs_cohort1) cluster(region1982
. outreg2 using "Figure3.txt", append sideway ///
noparen se nonotes nocons noaster ///
nolabel text keep(I1946-I1962) ///
sortvar(I1946-I1962) //导出回归系数到Figure3.txt

. *2000人口普查数据
. use census_2000_clean.dta, clear
. global var_abs_cohort2 "region2000 prov#year_birth ///
c.primary_base_older#year_birth c.junior_base_older#year_birth"
. forvalues y = 1946/1979 {
gen I`y' = sdy_density*[year_birth==`y']
}
. reghdfe yedu I1946-I1979 male han_ethn, ///
absorb($var_abs_cohort2) cluster(region2000)
. outreg2 using "Figure3.txt", append sideway ///
noparen se nonotes nocons noaster ///
nolabel text keep(I1946-I1979) ///
sortvar(I1946-I1979) //导出回归系数到Figure3.txt
*绘图
insheet using "Figure3.txt", clear
keep if inrange(_n,5,38)
gen year = substr(v1,2,4)

rename (v2 v3 v4 v5 v6 v7)(coef1990 se1990 coef1982 se1982 coef2000 se2000)
destring, force replace
keep year coef* se*

reshape long coef se, i(year) j(data)
drop if coef == .

gen lb = coef - 1.96*se
gen ub = coef + 1.96*se
gen y_overlap = min(max(year-1955,0),max(1970-year,0),6)
sort data year

twoway line lb year if data==1982, sort lpattern(dash) ///
lcolor(gs8) yaxis(1) || line ub year if data==1982, ///
sort lpattern(dash) lcolor(gs8) || line coef year ///
if data==1982, lwidth(thick) lcolor(black) yaxis(1) ///
|| line y_overlap year if data==1982, sort ///
lpattern(dash_dot) lwidth(thick) lcolor(gs8) ///
yaxis(2) ||, graphregion(fcolor(gs16) lcolor(gs16)) ///
plotregion(lcolor(gs16) margin(zero)) ylabel(-4(2)8, ///
labsize(small) angle(0) format(%12.0f) axis(1)) ///
ytitle("Coefficients", size(small) axis(1)) ///
ylabel(0(2)6, labsize(small) angle(0) format(%12.0f) ///
axis(2)) ytick(-6 0(1)6 12,axis(2)) ///
ytitle("Years of Overlap", size(small) axis(2)) ///
xlabel(1945(5)1980, labsize(small)) xtick(1945(5)1980) ///
xtitle("Birth Cohort", size(small)) xline(1955 1970, ///
lpattern(solid) lwidth(thin) lcolor(black)) ///
title("Panel A - Census 1982", size(small) margin(small)) ///
yline(0, lpattern(solid) lwidth(thin) lcolor(black)) ///
legend(off) fxsize(70) fysize(60)
graph save a,replace //Figure3-PanelA: Census 1982

twoway line lb year if data==1990, lpattern(dash) lcolor(gs8) ///
yaxis(1) || line ub year if data==1990, lpattern(dash) ///
lcolor(gs8) || line coef year if data==1990, lwidth(thick) ///
lcolor(black) yaxis(1) || line y_overlap year if data==1990, ///
lpattern(dash_dot)lwidth(thick) lcolor(gs8) yaxis(2) ||, ///
graphregion(fcolor(gs16) lcolor(gs16)) plotregion(lcolor(gs16) ///
margin(zero)) ylabel(-4(2)8,labsize(small) angle(0) ///
format(%12.0f) axis(1)) ytitle("Coefficients", size(small) ///
axis(1)) ylabel(0(2)6, labsize(small) angle(0) format(%12.0f) ///
axis(2)) ytick(-6 0(1)6 12,axis(2)) ytitle("Years of Overlap", ///
size(small) axis(2)) xlabel(1945(5)1980, labsize(small)) ///
xtick(1945(5)1980) xtitle("Birth Cohort", size(small)) ///
xline(1955 1970,lpattern(solid) lwidth(thin) lcolor(black)) ///
title("Panel B - Census 1990", size(small) margin(small)) ///
yline(0, lpattern(solid) lwidth(thin) lcolor(black)) ///
legend(off) fxsize(70) fysize(60)
graph save b,replace //Figure3-PanelB: Census 1990

twoway line lb year if data==2000, lpattern(dash) lcolor(gs8) yaxis(1) ///
|| line ub year if data==2000, lpattern(dash) lcolor(gs8) ///
|| line coef year if data==2000, lwidth(thick) lcolor(black) ///
yaxis(1) || line y_overlap year if data==2000, lpattern(dash_dot) ///
lwidth(thick) lcolor(gs8) yaxis(2) ||, graphregion(fcolor(gs16) ///
lcolor(gs16)) plotregion(lcolor(gs16) margin(zero)) ylabel(-3(1)6, ///
labsize(small) angle(0) format(%12.0f) axis(1)) ///
ytitle("Coefficients", size(small) axis(1)) ///
ylabel(0(2)6, labsize(small) angle(0) format(%12.0f) ///
axis(2)) ytick(-6 0(1)6 12,axis(2)) ///
ytitle("Years of Overlap", size(small) axis(2)) ///
xlabel(1945(5)1980, labsize(small)) xtick(1945(5)1980) ///
xtitle("Birth Cohort", size(small)) legend(order(3 1 4) ///
label(3 "Coefficient") label(1 "95% CI") ///
label(4 "Overlapped Years in""Primary Schools") col(2) ///
size(small) margin(tiny)) xline(1955 1970, lpattern(solid) ///
lwidth(thin) lcolor(black)) title("Panel C - Census 2000", ///
size(small) margin(small)) yline(0, lpattern(solid) lwidth(thin) ///
lcolor(black)) fxsize(65) fysize(80)
graph save c,replace //Figure3-PanelC: Census 2000

twoway || connected coef year if data==1982, lwidth(medthick) ///
msymbol(triangle) color(black) || line coef year if data==1990, ///
lwidth(medthick) color(gs6) || connected coef year if data==2000, ///
lwidth(medthick) msymbol(square) color(gs12) ||, ///
graphregion(fcolor(gs16) lcolor(gs16)) plotregion(lcolor(gs16) ///
margin(zero)) ylabel(-2(1)5, labsize(small) angle(0) ///
format(%12.0f)) ytitle("Coefficients", size(small)) ///
xlabel(1945(5)1980, labsize(small)) xtick(1945(5)1980) ///
xtitle("Birth Cohort", size(small)) legend(label(1 "Census 1982") ///
label(2 "Census 1990") label(3 "Census 2000") col(2) size(small)) ///
xline(1955 1970, lpattern(solid) lwidth(thin) lcolor(black)) ///
title("Panel D - Three Censuses in One Graph", size(small) ///
margin(small)) yline(0, lpattern(solid) lwidth(thin) ///
lcolor(black)) fxsize(70) fysize(80)
graph save d,replace //Figure3-PanelD: Three censuses in one graph

graph combine a.gph b.gph c.gph d.gph, ///
graphregion(fcolor(gs16) lcolor(gs16)) //Figure3

可以看出,在 1956 之前的出生队列, 的估计结果基本接近于0,并且无法拒绝其等于 0 的原假设。这说明在知青 “上山下乡” 运动开始之前,不同出生队列个体的受教育年限并没有出现异质性的趋势,平行趋势检验通过。

在 1956 之后的出生队列, 的估计值不断增大且较为显著。这说明知青 “上山下乡” 运动开始之后,其对农村孩子受教育年限的促进作用不断增强。1970 之后的出生队列,的估计值有所下降但仍然显著,说明知青 “上山下乡” 运动结束之后,其影响虽然有所减弱但依然持续存在。

5. 参考文献

  • Chen Y, Fan Z, Gu X, et al. Arrival of Young Talent: The Send-Down Movement and Rural Education in China[J]. American Economic Review, 2020, 110(11): 3393-3430. -PDF--Data and Codes-
  • Chen Y, Zhou L A. The long-term health and economic consequences of the 1959–1961 famine in China[J]. Journal of health economics, 2007, 26(4): 659-681. -Link-
  • Duflo E. Schooling and labor market consequences of school construction in Indonesia: Evidence from an unusual policy experiment[J]. American economic review, 2001, 91(4): 795-813. -PDF-
  • 程令国, 张晔. 早年的饥荒经历影响了人们的储蓄行为吗?——对我国居民高储蓄率的一个新解释[J]. 经济研究, 2011, 46(08):119-132. -Link-
  • 功夫计量经济学推文,截面DID的玩法:大饥荒影响了人们的储蓄行为吗?-Link-
  • 功夫计量经济学推文,Cohort DID经典之作:大饥荒影响了人们的健康状况和社会经济状况吗?-Link-
  • 功夫计量经济学推文,Cohort DID新作:知识青年上山下乡推动了中国农村教育的发展吗?-Link-(https://mp.weixin.qq.com/s/8ksCfk7z3jPRGf7ouAAZsw)
  • 功夫计量经济学推文,DID大法:如何在Stata中实现队列DID操作?-Link-

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh DID, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

  • 专题:Stata命令

    • DIDM:多期多个体倍分法-did_multiplegt
  • 专题:倍分法DID

    • 多期DID文献解读:含铅汽油与死亡率和社会成本
    • DID陷阱解析-L111
    • 面板PSM+DID如何做匹配?
    • 倍分法:DID是否需要随机分组?
    • Fuzzy DID:模糊倍分法
    • DID:仅有几个实验组样本的倍分法 (双重差分)
    • 考虑溢出效应的倍分法:spillover-robust DID
    • tfdiff:多期DID的估计及图示
    • 倍分法DID:一组参考文献
    • Stata:双重差分的固定效应模型-(DID)
    • 倍分法(DID)的标准误:不能忽略空间相关性
    • 多期DID之安慰剂检验、平行趋势检验
    • DID边际分析:让政策评价结果更加丰满
    • Big Bad Banks:多期 DID 经典论文介绍
    • 多期DID:平行趋势检验图示
    • Stata:多期倍分法 (DID) 详解及其图示
    • 倍分法DID详解 (一):传统 DID
    • 倍分法DID详解 (二):多时点 DID (渐进DID)
    • 倍分法DID详解 (三):多时点 DID (渐进DID) 的进一步分析
  • 专题:内生性-因果推断

    • Abadie新作:简明IV,DID,RDD教程和综述

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下:连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存